Technical Q&A QA1248
Context Sharing Tips


Q: OpenGL ÉRÉìÉeÉLÉXÉgä‘Ç≈ÉäÉ\Å[ÉXÇã§óLÇ∑ÇÈÇ…ÇÕǫǧǵÇΩÇÁÇÊÇ¢Ç≈Ç∑Ç©ÅH

A: ÉRÉìÉeÉLÉXÉgÇÃçÏê¨éûÇ…ã§óLÉRÉìÉeÉLÉXÉgÇéwíËÇ∑ÇÈDZÇΔÇ…ÇÊÇËÅAÉRÉìÉeÉLÉXÉgÇÕÉIÉuÉWÉFÉNÉgÉäÉ\Å[ÉXÇΔǪÇÍÇ…ä÷òAÇ∑ÇÈÉIÉuÉWÉFÉNÉgèÛë‘Çã§óLÇ≈Ç´Ç‹Ç∑ÅBã§óLÉRÉìÉeÉLÉXÉgÇÕÅAã§óLÇénÇflÇÈëOå„Ç…çÏê¨Ç≥ÇÍÇΩÉeÉNÉXÉ`ÉÉÉIÉuÉWÉFÉNÉgÅAí∏ì_îzóÒÉIÉuÉWÉFÉNÉgÅAÉfÉBÉXÉvÉåÉCÉäÉXÉgÅAí∏ì_ÉvÉçÉOÉâÉÄÅAÉtÉâÉOÉÅÉìÉgÉvÉçÉOÉâÉÄÇÇ∑Ç◊ǃã§óLǵNjÇ∑ÅBDZÇÍÇÁÇÃÉIÉuÉWÉFÉNÉgÇÃèÛë‘LJã§óLÇ≥ÇÍÇ‹Ç∑Ç™ÅAëºÇÃÉRÉìÉeÉLÉXÉgèÛë‘ÇÕã§óLÇ≥ÇÍÇ‹ÇπÇÒÅBÇ∑Ç◊ǃÇÃÉRÉìÉeÉLÉXÉgÇ™ÅAëºÇÃÇ«ÇÃÉRÉìÉeÉLÉXÉgÇΔLJã§óLÇ≈Ç´ÇÈÇÌÇØÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅBìØÇ∂ÉåÉìÉ_ÉâÇÃÉZÉbÉgÇ™óºï˚ÇÃÉRÉìÉeÉLÉXÉgÇÉTÉ|Å[ÉgǵǃǢÇÈǩǫǧǩDžëÂÇ´Ç≠àÀë∂ǵNjÇ∑ÅBëSëÃìIÇ…ÇÕÅAã§óLÉRÉìÉeÉLÉXÉgÇégǧDZÇΔÇ…ÇÊǡǃÅAÉäÉ\Å[ÉXÇÃèdï°ÅAÉZÉbÉgÉAÉbÉvÇÃÉRÉXÉgÅAÉfÉxÉçÉbÉpÇÃÉRÅ[ÉfÉBÉìÉOÇåyå∏Ç≈Ç´Ç‹Ç∑ÅB

äÓëb

OpenGL ÉRÉìÉeÉLÉXÉgÇçÏê¨Ç∑ÇÈç€Ç…ÅAÉIÉuÉWÉFÉNÉgÉäÉ\Å[ÉXÇã§óLÇ∑ÇÈï ÇÃÉRÉìÉeÉLÉXÉgÇéwíËÇ≈Ç´Ç‹Ç∑ÅBã§óLÇÕÇ∑Ç◊ǃÉsÉAÉcÅ[ÉsÉAÇ≈džÇÈÇΩÇflÅAÉfÉxÉçÉbÉpÇÕÅAã§óLÉäÉ\Å[ÉXÇ…ëŒÇ∑ÇÈéQèΔÉJÉEÉìÉgÇ™à€éùÇ≥ÇÍǃǮÇËÅAǵÇΩǙǡǃÉäÉ\Å[ÉXÇ™ñæé¶ìIÇ…âï˙Ç≥ÇÍÇÈÇ©ÅAÉäÉ\Å[ÉXÇç≈å„Ç‹Ç≈ã§óLǵǃǢÇÈÉRÉìÉeÉLÉXÉgé©ëÃÇ™âï˙Ç≥ÇÍÇÈÇ‹Ç≈ÅAã§óLÉäÉ\Å[ÉXÇ™à€éùÇ≥ÇÍÇÈLJÇÃÇΔëzíËÇ≈Ç´Ç‹Ç∑ÅBDZÇÍÇÕÇ≈Ç´ÇÈÇæÇØä»íPÇ…çlǶǃÅAâflìxÇ…ï°éGǻLJÇÃÇΔëzíËǵǻǢǟǧǙÇÊÇ¢Ç≈ǵÇÂǧÅB

ã§óLÇ≥ÇÍÇÈLJÇÃÇΔÇ≥ÇÍǻǢLJÇÃ

ÉRÉìÉeÉLÉXÉgÇÕÅuÉIÉuÉWÉFÉNÉgÉäÉ\Å[ÉXÅvÇã§óLǵNjÇ∑ÅBãÔëÃìIÇ…ÇÕÅAÉeÉNÉXÉ`ÉÉÅAí∏ì_îzóÒÉIÉuÉWÉFÉNÉgÅAÉfÉBÉXÉvÉåÉCÉäÉXÉgÅAí∏ì_ÉvÉçÉOÉâÉÄÅAÉtÉâÉOÉÅÉìÉgÉvÉçÉOÉâÉÄÇ≈Ç∑ÅBÉeÉNÉXÉ`ÉÉÉpÉâÉÅÅ[É^Ç‚ÉvÉçÉOÉâÉÄä¬ã´ÉpÉâÉÅÅ[É^ǻǫÇÃÅAÉIÉuÉWÉFÉNÉgèÛë‘LJã§óLÇ≥ÇÍÇ‹Ç∑ÅBÉeÉNÉXÉ`ÉÉÉ^Å[ÉQÉbÉgÇÃóLå¯âªÇÃèÛë‘ÅAåªç›ÇÃÉtÉâÉOÉÅÉìÉgÅ^í∏ì_ÉvÉçÉOÉâÉÄǻǫÅAÉIÉuÉWÉFÉNÉgà»äOÇÃèÛë‘ÇÕã§óLÇ≥ÇÍÇ‹ÇπÇÒÅBÉNÉâÉCÉAÉìÉgÇÕïKóvÇ…âûÇ∂ǃÅAÉRÉìÉeÉLÉXÉgèÛë‘ÇÃïœçXÇï°êªÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑Ç™ÅAå¬ÅXÇÃÉIÉuÉWÉFÉNÉgÇÃÉZÉbÉgÉAÉbÉvÇÕ 1 âÒÇæÇØçsǧïKóvǙdžÇËÇ‹Ç∑ÅB

ã§óLÇ≈Ç´ÇÈÉRÉìÉeÉLÉXÉg

ÉRÉìÉeÉLÉXÉgÇÃã§óLÇÕÅAìØàÍÇÃâºëzÉXÉNÉäÅ[ÉìÉ}ÉbÉsÉìÉOÇéùǡǃǢÇÈÉRÉìÉeÉLÉXÉgÇ…å¿ÇÁÇÍÇ‹Ç∑ÅBǬNjÇËÅANjǡÇΩÇ≠ìØÇ∂ÉåÉìÉ_ÉâÇÃÉZÉbÉgÇégǡǃê›íËÇ≥ÇÍÇΩÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇÕÅAã§óLâ¬î\Ç»ÉRÉìÉeÉLÉXÉgÇçÏê¨Ç≈Ç´ÇÈÇΔǢǧDZÇΔÇ≈Ç∑ÅBDZÇÃñ⁄ïWÇíBê¨Ç∑ÇÈíPèÉÇ»ï˚ñ@Ç™ 2 ǬdžÇËÇ‹Ç∑ÅB1 ǬÇÕÅAÉNÉâÉCÉAÉìÉgÇ™ã§óLǵÇΩÇ¢Ç∑Ç◊ǃÇÃÉRÉìÉeÉLÉXÉgÇ…ëŒÇµÇƒÅANjǡÇΩÇ≠ìØÇ∂ÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇégǧDZÇΔÇ≈Ç∑ÅBDZÇÍÇ…ÇÊÇËÅAâºëzÉXÉNÉäÅ[ÉìÉ}ÉbÉsÉìÉOÇ™ìØÇ∂Ç≈džÇËÅAǵÇΩǙǡǃÉRÉìÉeÉLÉXÉgÇã§óLÇ∑ÇÈî\óÕǙdžÇÈDZÇΔÇ™ï€èÿÇ≥ÇÍÇ‹Ç∑ÅBÇ¢Ç≠ǬǩÇÃÉPÅ[ÉXÇ≈ÇÕÅAóvãÅÇ≥ÇÍÇÈÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇ™àŸÇ»ÇÈÇΩÇflÇ…ÅAÉåÉìÉ_ÉâÇÃÉZÉbÉgÇàÍívÇ≥ÇπÇÈDZÇΔÇ™óeà’Ç≈ǻǢèÍçáǙdžÇËÇ‹Ç∑ÅBDZÇÃèÍçáÇÃç≈LJä»íPÇ»âåàçÙÇÕÅAÇ∑Ç◊ǃÇÃÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇ…ëŒÇµÇƒíPàÍÇÃÉåÉìÉ_ÉâÇëIëÇ∑ÇÈDZÇΔÇ≈Ç∑ÅB

ÉRÉìÉeÉLÉXÉgÇã§óLÇ∑ÇÈê≥ämÇ»ï˚ñ@

ÉRÉìÉeÉLÉXÉgÇã§óLÇ∑ÇÈÇÃÇÕîÒèÌÇ…ä»íPÇ≈Ç∑ÅBä÷êîåƒÇ—èoǵÇÃê≥ämÇ»å`éÆÇÕÅAégópǵǃǢÇÈ API Ç…ÇÊǡǃàŸÇ»ÇËÇ‹Ç∑ÅBCGLÅAAGLÅAÇ®ÇÊÇ— NSOpenGL ÇÃó·ÇÉäÉXÉg 1 Ç…é¶ÇµÇ‹Ç∑ÅB

ÉäÉXÉg 1a. CGL Ç≈ÇÃÉRÉìÉeÉLÉXÉgÇÃã§óLê›íË

#include <OpenGL/OpenGL.h>

// íçÅFê‡ñæÇÃñ⁄ìIÇÃìsçáè„ÅAí èÌÇÕíPàÍÇÃÉtÉãÉXÉNÉäÅ[ÉìÇÃ
// CGL ÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇçÏê¨Ç∑ÇÈLJÇÃÇΔÇ∑ÇÈÅBDZÇÃó·ÇÕÉäÉXÉg 2 ÇéQèΔ
CGLPixelFormatAttribute attrib[] = {kCGLPFADoubleBuffer, 0};
CGLPixelFormatObj pixelFormat = NULL;
long numPixelFormats = 0;
CGLContextObj cglContext1 = NULL;
CGLContextObj cglContext2 = NULL;
     
CGLChoosePixelFormat (attribs, &pixelFormat, &numPixelFormats);
CGLCreateContext(pixelFormat, NULL, &cglContext1);

// ç≈èâÇÃÉRÉìÉeÉLÉXÉgÇΔã§óLÇ∑ÇÈ 2 î‘ñ⁄ÇÃÉRÉìÉeÉLÉXÉgÇçÏê¨
CGLCreateContext(pixelFormat, cglContext1, &cglContext2);

ÉäÉXÉg 1b. AGL Ç≈ÇÃÉRÉìÉeÉLÉXÉgÇÃã§óLê›íË

#include <AGL/agl.h>

GLint attrib[] = {AGL_RGBA, AGL_DOUBLEBUFFER, AGL_NONE};
     
AGLPixelFormat aglPixFmt = aglChoosePixelFormat (NULL, 0, attrib);
AGLContext aglContext1 = aglCreateContext (aglPixFmt, NULL);

// ç≈èâÇÃÉRÉìÉeÉLÉXÉgÇΔã§óLÇ∑ÇÈ 2 î‘ñ⁄ÇÃÉRÉìÉeÉLÉXÉgÇçÏê¨
AGLContext aglContext2 = aglCreateContext (aglPixFmt, aglContext1);

ÉäÉXÉg 1c. NSOpenGL Ç≈ÇÃÉRÉìÉeÉLÉXÉgÇÃã§óLê›íËÇïœçX

#import <Cocoa/Cocoa.h>

+ (NSOpenGLPixelFormat*)defaultPixelFormat
{
  NSOpenGLPixelFormatAttribute attributes [] = {
                               NSOpenGLPFADoubleBuffer,  // É_ÉuÉãÉoÉbÉtÉ@
                               (NSOpenGLPixelFormatAttribute)nil };
  
  return [[(NSOpenGLPixelFormat *)[NSOpenGLPixelFormat alloc] 
                                  initWithAttributes:attribs] autorelease];
}

- (NSOpenGLContext*)openGLContextWithShareContext:(NSOpenGLContext*)context
{ // èâÇflǃí ÇÈÇΔÇ´ÇÕÉRÉìÉeÉLÉXÉgÇçÏê¨
   if (_openGLContext == NULL) {
    _openGLContext = [[NSOpenGLContext alloc] 
                      initWithFormat:[[self class] defaultPixelFormat]
                      shareContext:context];
    [_openGLContext makeCurrentContext];
    [self prepareOpenGL]; // DZDZÇ≈ OpenGL èÛë‘Çèâä˙âªÇ∑ÇÈåƒÇ—èoǵ
  }
  return _openGLContext;
}

- (void)prepareOpenGL
{
  // OpenGL èÛë‘ÇÉIÅ[ÉoÅ[ÉâÉCÉhǵǃèâä˙âªÇ∑ÇÈÇΩÇflÇ…ÅA
  // ÉRÉìÉeÉLÉXÉgçÏê¨å„Ç…î≠ê∂
}

Ç‹ÇΩÅAì¡íËÇÃÉfÉBÉXÉvÉåÉCÉXÉNÉäÅ[ÉìÇ…íPàÍÇÃÉåÉìÉ_ÉâÇégópÇ∑ÇÈÇÊǧDžÉRÉìÉeÉLÉXÉgÇê›íËÇ∑ÇÈDZÇΔLJî‰ärìIä»íPÇ≈Ç∑ÅBOpenGL ÉtÉåÅ[ÉÄÉèÅ[ÉNÇÕí èÌÅAÉ\ÉtÉgÉEÉFÉAÇ…ÇÊÇÈÉtÉHÅ[ÉãÉoÉbÉNÉåÉìÉ_ÉâÇíÒãüÇ∑ÇÈÇΩÇflÅAÇ‹ÇæÉtÉãÉXÉNÉäÅ[ÉìÇéwíËǵǃǢǻǢèÍçáÇÕÅiÉtÉãÉXÉNÉäÅ[ÉìÇ™ÅuÉäÉJÉoÉäǻǵÅvÇà”ñ°Ç∑ÇÈÇΩÇflÅjÅAÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgëÆê´Ç≈ÅuÉäÉJÉoÉäǻǵÅvÇéwíËǵǃÅADZÇÍÇñæé¶ìIÇ…âÒîÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉäÉXÉg 2 Ç…ÇÕÅAíPàÍÉfÉBÉXÉvÉåÉCÇÃÇ›ÇÃÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇê›íËÇ∑ÇÈï˚ñ@Çó·é¶ÇµÇ‹Ç∑ÅB

ÉäÉXÉg 2a. CGL Ç≈ÇÃíPàÍÉXÉNÉäÅ[ÉìÇÃÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉg

#include <OpenGL/OpenGL.h>

// ÉtÉãÉXÉNÉäÅ[ÉìÇÃíPàÍÉhÉçÅ[ÉAÉuÉãÇÃÉsÉNÉZÉãëÆê´ÉZÉbÉg
CGLPixelFormatAttribute attribs[] = { kCGLPFADisplayMask, 0,
                                      kCGLPFAFullScreen,
                                      kCGLPFADoubleBuffer,
                                      0 };
CGLPixelFormatObj pixelFormat = NULL;
long numPixelFormats = 0;
CGLContextObj cglContext = NULL;

// ëIëǵÇΩÉfÉBÉXÉvÉåÉCÇÃÉfÉBÉXÉvÉåÉCÉ}ÉXÉNëÆê´ÇñÑÇflÇÈ
CGDirectDisplayID display = CGMainDisplayID ();
attribs[1] = CGDisplayIDToOpenGLDisplayMask (display); 
CGLChoosePixelFormat (attribs, &pixelFormat, &numPixelFormats);

ÉäÉXÉg 2b. AGL Ç≈ÇÃíPàÍÉXÉNÉäÅ[ÉìÇÃÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉg

#include <AGL/agl.h>

GLint attrib[] = {AGL_RGBA, GL_DOUBLEBUFFER, AGL_NO_RECOVERY, AGL_NONE};
     
GDHandle display = GetMainDevice ();
AGLPixelFormat aglPixFmt = aglChoosePixelFormat (&display, 1, attrib);

ÉäÉXÉg 2c. NSOpenGL Ç≈ÇÃíPàÍÉXÉNÉäÅ[ÉìÇÃÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉg

#import <Cocoa/Cocoa.h>

+ (NSOpenGLPixelFormat*)defaultPixelFormat
{
  NSOpenGLPixelFormatAttribute attributes [] = {
                               NSOpenGLPFAScreenMask,
                               0,
                               NSOpenGLPFANoRecovery,
                               NSOpenGLPFADoubleBuffer,  // É_ÉuÉãÉoÉbÉtÉ@
                               (NSOpenGLPixelFormatAttribute)nil };
  
// ëIëǵÇΩÉfÉBÉXÉvÉåÉCÇÃÉfÉBÉXÉvÉåÉCÉ}ÉXÉNëÆê´ÇñÑÇflÇÈ
CGDirectDisplayID display = CGMainDisplayID ();
attributes[1] = (NSOpenGLPixelFormatAttribute) 
                                  CGDisplayIDToOpenGLDisplayMask (display);
return [[(NSOpenGLPixelFormat *)[NSOpenGLPixelFormat alloc] 
                                  initWithAttributes:attribs] autorelease];
}

ï‚ë´

íPàÍÇÃÉfÉBÉXÉvÉåÉCÅAǵÇΩǙǡǃíPàÍÇÃÉåÉìÉ_ÉâÇÉTÉ|Å[ÉgÇ∑ÇÈÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇéwíËǵÇΩèÍçáÇÕÅAÉEÉBÉìÉhÉEâªÇ≥ÇÍǃǢÇÈÉhÉçÅ[ÉAÉuÉãÇï ÇÃÉXÉNÉäÅ[ÉìÇ…ÉhÉâÉbÉOǵÇΩÇËÅAÉtÉãÉXÉNÉäÅ[ÉìÉRÉìÉeÉLÉXÉgÇï ÇÃÉfÉBÉXÉvÉåÉCÇ…ÉAÉ^ÉbÉ`ǵÇΩÇËÇ∑ÇÈÇΔÅAÉåÉìÉ_ÉäÉìÉOÇ…é∏îsÇ∑ÇÈÇ©ÅAÇ‹ÇΩÇÕéwíËǵÇΩÉåÉìÉ_ÉâÇ≈ÅAêVǵǢÉfÉBÉXÉvÉåÉCÇ…ÉRÉsÅ[ÇégǡǃÉåÉìÉ_ÉäÉìÉOÇ™çsÇÌÇÍÇÈâ¬î\ê´Ç™Ç†ÇËÇ‹Ç∑ÅBÇ«ÇøÇÁLJñ]NjǵǢDZÇΔÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅBà¿ëSÇçlǶǃÅAÉåÉìÉ_ÉâÇÃïœçXÇåüèoǵǃëŒèàÇ∑ÇÈÇÊǧǻÉRÅ[ÉhÇçÏê¨Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB

ÉtÉãÉXÉNÉäÅ[ÉìÇÃÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇégÇ¡ÇΩÉEÉBÉìÉhÉEâªÇ≥ÇÍÇΩÉhÉçÅ[ÉAÉuÉãDžǬǢǃ

ÉEÉBÉìÉhÉEâªÇ≥ÇÍÇΩÉXÉNÉäÅ[ÉìÇΔÅAÉtÉãÉXÉNÉäÅ[ÉìÇÃÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇÃã§óLÇÇ≥ÇÁÇ…ä»ëfâªÇ∑ÇÈÇΩÇflÇ…ÅAÉEÉBÉìÉhÉEâªÇ≥ÇÍÇΩÉhÉçÅ[ÉAÉuÉãÇ≈ÉtÉãÉXÉNÉäÅ[ÉìÇÃÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇégǧã@î\Ç™ Mac OS X v10.3 (Panther) Ç…í«â¡Ç≥ÇÍNjǵÇΩÅBǬNjÇËÅAÉNÉâÉCÉAÉìÉgÇÕÉtÉãÉXÉNÉäÅ[ÉìÇéwíËǵǃ 1 ǬÇÃÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇçÏê¨ÇµÅAǪÇÍÇégǡǃÉEÉBÉìÉhÉEâªÇ≥ÇÍÇΩÉXÉNÉäÅ[ÉìÇΔÉtÉãÉXÉNÉäÅ[ÉìÇÃÉRÉìÉeÉLÉXÉgÇÉTÉ|Å[ÉgÇ≈Ç´Ç‹Ç∑ÅBÉtÉãÉXÉNÉäÅ[ÉìÇÃÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇ™ñæé¶ìIÇ…íPàÍÇÃÉfÉBÉXÉvÉåÉCÇÉTÉ|Å[ÉgÇ∑ÇÈÇΩÇflÇÃóvåèÇΔÅAã§óLÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgǙNjǡÇΩÇ≠ìØÇ∂ÉXÉNÉäÅ[Éìê›íËÇÉTÉ|Å[ÉgÇ∑ÇÈÇΩÇflÇÃóvåèÇÕä…òaÇ≥ÇÍǃǮÇÁÇ∏ÅADZÇÃóvåèÇÕàÀëRÇΔǵǃñûÇΩǵǃǢÇÈïKóvǙdžÇËÇ‹Ç∑ÅB


[2003 îN 6 åé 24 ì˙]